﻿using System;

// 定义形状接口
public interface IShape
{
    double Area();       // 计算面积
    bool IsValid();      // 判断形状是否合法
}

// 定义抽象形状类，其他形状类可以继承此类
public abstract class Shape : IShape
{
    public abstract double Area();    // 计算面积的抽象方法
    public abstract bool IsValid();   // 判断形状是否合法的抽象方法
}

// 长方形类
public class Rectangle : Shape
{
    public double Length { get; set; }
    public double Width { get; set; }

    public Rectangle(double length, double width)
    {
        Length = length;
        Width = width;
    }

    // 实现计算面积的方法
    public override double Area()
    {
        return Length * Width;
    }

    // 实现判断长方形是否合法的方法
    public override bool IsValid()
    {
        return Length > 0 && Width > 0;
    }
}

// 正方形类
public class Square : Rectangle
{
    public Square(double side) : base(side, side) { }

    // 正方形的面积计算继承自长方形
    public override double Area()
    {
        return Length * Length; 
    }

    // 判断正方形是否合法
    public override bool IsValid()
    {
        return Length > 0; // 只需要一个边长大于0即可
    }
}

// 三角形类
public class Triangle : Shape
{
    public double Base { get; set; }
    public double Height { get; set; }

    public Triangle(double baseLength, double height)
    {
        Base = baseLength;
        Height = height;
    }

    // 实现计算三角形面积的方法
    public override double Area()
    {
        return 0.5 * Base * Height;
    }

    // 判断三角形是否合法的方法
    public override bool IsValid()
    {
        return Base > 0 && Height > 0;
    }
}

// 主程序
class Program
{
    static void Main()
    {
        // 创建随机数生成器
        Random rand = new Random();

        // 用来存储所有生成的形状对象
        IShape[] shapes = new IShape[10];

        // 随机生成10个形状对象
        for (int i = 0; i < 10; i++)
        {
            shapes[i] = ShapeFactory.CreateShape(rand);
        }

        // 计算所有形状的面积之和
        double totalArea = 0;
        foreach (var shape in shapes)
        {
            if (shape.IsValid()) // 只计算合法的形状
            {
                totalArea += shape.Area();
            }
        }

        // 输出面积之和
        Console.WriteLine("所有形状的面积之和: " + totalArea);
    }
}

// 简单工厂类，负责创建不同的形状
public static class ShapeFactory
{
    public static IShape CreateShape(Random rand)
    {
        // 随机生成一个整数来决定创建哪种形状
        int shapeType = rand.Next(3);

        switch (shapeType)
        {
            case 0: // 创建长方形
                double length = rand.Next(1, 11); // 长度 1 到 10
                double width = rand.Next(1, 11); // 宽度 1 到 10
                return new Rectangle(length, width);

            case 1: // 创建正方形
                double side = rand.Next(1, 11); // 边长 1 到 10
                return new Square(side);

            case 2: // 创建三角形
                double baseLength = rand.Next(1, 11); // 底边 1 到 10
                double height = rand.Next(1, 11); // 高度 1 到 10
                return new Triangle(baseLength, height);

            default:
                throw new ArgumentException("未知形状类型");
        }
    }
}